package top.hkyzf.study.datastructure.sparsearray;

import java.io.*;
import java.util.Arrays;

/**
 * 稀疏数组（将稀疏数组保存到硬盘）
 * @author 朱峰
 * @date 2020-12-17 13:28
 */
public class SparseArrayToDisk {
    public static void main(String[] args) {
        // 1. 先定义一个原数组并赋值。

        // 定义一个11*11的数组
        int [][] chessArrayOld = new int[11][11];
        // 赋初始值
        // chessArrayOld[1][2] = 1;
        // chessArrayOld[2][3] = 2;
        chessArrayOld[0][0] = 11;
        chessArrayOld[1][1] = 1;
        chessArrayOld[2][2] = 2;
        chessArrayOld[3][3] = 3;
        chessArrayOld[4][4] = 4;
        chessArrayOld[5][5] = 5;
        chessArrayOld[6][6] = 6;
        chessArrayOld[7][7] = 7;
        chessArrayOld[8][8] = 8;
        chessArrayOld[9][9] = 9;
        chessArrayOld[10][10] = 10;
        // 打印原数组
        System.out.println("原始数组为：");
        printArray(chessArrayOld);


        // 2. 转换为稀疏数组

        // 定义变量储存原数组有效数字，即稀疏数组行数
        int count = 0;
        for(int i=0; i<chessArrayOld.length; i++) {
            for(int j=0; j<chessArrayOld[i].length; j++) {
                // 数字有效
                if(chessArrayOld[i][j] != 0) {
                    count++;
                }
            }
        }
        // 定义一个稀疏数组
        int [][] sparseArray = new int[count+1][3];
        // 赋值第一行
        sparseArray[0][0] = chessArrayOld.length;
        sparseArray[0][1] = chessArrayOld[0].length;
        sparseArray[0][2] = count;
        // 赋值后面几行
        count = 0;
        for(int i=0; i<chessArrayOld.length; i++) {
            for(int j=0; j<chessArrayOld[i].length; j++) {
                // 数字有效，储存在稀疏数组中
                if(chessArrayOld[i][j] != 0) {
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = chessArrayOld[i][j];
                }
            }
        }
        System.out.println("稀疏数组为：");
        printArray(sparseArray);


        // 3. 保存本地文件
        writeFile(sparseArray);

    }

    // 输出数组结果
    private static void printArray(int [][] arrays) {
        for(int i=0; i<arrays.length; i++) {
            for(int j=0; j<arrays[i].length; j++) {
                if(j == arrays[i].length-1) {
                    System.out.printf("%d", arrays[i][j]);
                } else {
                    System.out.printf("%d\t", arrays[i][j]);
                }
            }
            System.out.println();
        }
    }

    // 保存二维数组到本地 [1, 2, 3]
    private static void writeFile(int [][] arrays) {
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        BufferedWriter bw = null;

        try {
            fos = new FileOutputStream(SparseArrayToDisk.class.getResource("/").getPath() + "sparse.data");
            osw = new OutputStreamWriter(fos, "UTF-8");
            bw = new BufferedWriter(osw);

            for (int i=0; i<arrays.length; i++) {
                String strArray = Arrays.toString(arrays[i]);
                bw.write(strArray+"\n");
            }
            System.out.println("写入文件成功！");
            System.out.println("文件路径为：" + SparseArrayToDisk.class.getResource("/").getPath() + "sparse.data");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(bw != null) {
                    bw.close();
                }
                if(osw != null) {
                    osw.close();
                }
                if(fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}
